فرض کن در یه مسابقه شرکت کردی. بعد از هر مرحله، بهت یه کارنامه میدن که توش نوشته «قبول» یا «رد». توی لینوکس، هر فرمانی که اجرا میشه، یه کارنامه به اسم Exit Status برمیگردونه که به ما میگه آیا فرمان موفق بوده یا ناموفق. این جلسه بهت یاد میده چطور این کارنامه رو بخونی و ازش استفاده کنی!
هر فرمانی که در لینوکس اجرا میشود، پس از پایان کار، یک کد عددی به عنوان وضعیت خروج (Exit Status) به ترمینال یا فرمان والد خود ارسال میکند. این کد مشخص میکند که آیا فرمان با موفقیت اجرا شده یا با خطا مواجه شده است.
$? آخرین وضعیت خروج (Exit Status) فرمان قبلی را در خود ذخیره میکند. این متغیر همیشه در حال تغییر است و با اجرای هر فرمان جدید، مقدار آن بهروزرسانی میشود.
$? یک متغیر ویژه در Bash است که همیشه آخرین کد خروجی را نگه میدارد.
به طور کلی، کدهای خروجی به این صورت تفسیر میشوند:
0ls در یک دایرکتوری موجود.1ls در دایرکتوری بدون مجوز.2ls /hj (مسیر ناموجود).
توضیح: ls با موفقیت اجرا شده و کد خروجی 0 را برگردانده است.
توضیح: ls /hj با خطا مواجه شده است (مسیر وجود ندارد) و کد خروجی 2 را برگردانده است.
توضیح: cat /etc/shadow به دلیل عدم مجوز دسترسی با خطا مواجه شده و کد خروجی 1 را برگردانده است.
echo اجرا کنید، $? مربوط به همان echo خواهد بود.
$? در اسکریپتها
در اسکریپتنویسی، از $? برای بررسی موفقیت یا شکست یک فرمان استفاده میکنیم و بر اساس آن تصمیمگیری میکنیم.
توضیح: اسکریپت ابتدا mkdir را اجرا میکند، سپس با $? وضعیت آن را بررسی میکند و پیام مناسب را چاپ میکند.
|| و && با $?
عملگرهای && و || در واقع بر اساس کد خروجی فرمانها کار میکنند.
توضیح: اگر mkdir موفق باشد ($? = 0)، عبارت بعد از && اجرا میشود.
توضیح: اگر mkdir شکست بخورد ($? ≠ 0)، عبارت بعد از || اجرا میشود.
&& و || در واقع بر اساس کد خروجی فرمان اول تصمیم میگیرند که فرمان دوم را اجرا کنند یا نه.
برخی فرمانها برای خطاهای مختلف، کدهای خروجی متفاوتی دارند. برای مثال، دستور ls:
| کد خروجی | معنی در ls |
|---|---|
0 |
موفقیت (OK) |
1 |
مشکل جزئی (مثلاً عدم دسترسی به زیردایرکتوری) |
2 |
مشکل جدی (مثلاً آرگومان خط فرمان نامعتبر) |
برای اطلاع از کدهای خروجی دقیق هر فرمان، میتوانید به صفحه راهنما (man) آن فرمان مراجعه کنید.
$? → متغیر ویژه برای دسترسی به آخرین کد خروجی.0 → یعنی فرمان موفق بوده است.&& → اگر فرمان اول موفق باشد ($? = 0)، فرمان دوم را اجرا کن.|| → اگر فرمان اول ناموفق باشد ($? ≠ 0)، فرمان دوم را اجرا کن.یک اسکریپت بنویسید که:
cd به آن مسیر برود.$? وضعیت را بررسی کند.